﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Persistencia;
using Persistencia.NHibernate;
using Turismo.Areas.GestionRuta.Models;
using Turismo.Negocio.Analisis;
using Turismo.Negocio.EntidadesGeometricas;
using Algoritmos.RutaMasCorta;
using EstructurasDeDatos.EstructuraGrafo;
using Turismo.Negocio.Util;

namespace Turismo.Areas.GestionRuta.Controllers
{
    public class BuscarRutaController : Controller
    {
        private IRepositorio miPersistencia;

        public IRepositorio Persistencia
        {
            get
            {
                if (miPersistencia == null)
                {
                    miPersistencia = NHibernatePersistencia.Instancia;
                }
                return miPersistencia;
            }
            set { miPersistencia = value; }
        }
        //
        // GET: /GestionRuta/BuscarRuta/BuscarRuta

        public ActionResult BuscarRuta()
        {
            BuscarRutaModel model = new BuscarRutaModel();
            return View(model);
        }

        //
        // POST: /GestionRuta/BuscarRuta/BuscarRuta

        [HttpPost]
        public ActionResult BuscarRuta(BuscarRutaModel model)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    CGuia guia = new CGuia();                    
                    Cabecera cabeceraOrigen = Persistencia.Obtener<Cabecera>(model.CabeceraInicialId); 
                    Cabecera cabeceraDestino = Persistencia.Obtener<Cabecera>(model.CabeceraFinalId); 
                    int pesoTiempo = Convert.ToInt32(model.ImportanciaTiempo);
                    int numeroPasajeros = Convert.ToInt32(model.NumeroDePasajeros);
                    int pesoDinero = 100-pesoTiempo;
                    Boolean esPrivado = false;
                    if (model.TransporteIds.Count>0 && model.TransporteIds.First()==2)
                    {
                        esPrivado = true;
                    }
                    Grafo<Cabecera, Medio> grafo = guia.buscarRutas(cabeceraOrigen, cabeceraDestino, 3, pesoDinero, esPrivado, numeroPasajeros);
                    
                   
                    if (grafo.Nodos.Count >0)
                    {
                        Dijkstra<Cabecera, Medio> prueba = new Dijkstra<Cabecera, Medio>();
                        prueba.Grafo = grafo;
                        prueba.NodoInicial = cabeceraOrigen;
                        prueba.NodoFinal = cabeceraDestino;
                        List<NodoGrafo<Cabecera, Medio>> optima = prueba.Calcular();
                        PersistenciaNodoGrafo persistencia = new PersistenciaNodoGrafo();
                        persistencia.PersistirNodoGrafo(optima);                        
                    }                    

                    return View();
                }
                catch(Exception ex)
                {
                    String message = ex.Message;
                    return View();
                }
                
            }
            return View(model);
           
        }


        public ActionResult BuscarRutaDos()
        {
            BuscarRutaModel model = new BuscarRutaModel();
            return View(model);
        }

    }
}
